from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client
from rest_framework import serializers


class FastDFSStorage(Storage):
    """自定义文件存储类"""


    def _open(self, name, mode='rb'):
        """
        :param name: 要打开的文件的名字
        :param mode: 打开文件的模式
        :return: None
        """
        pass


    def _save(self,name,content):
        """
        功能：实现文件打保存动作
        :param file: 浏览器传递过来的图片数据被封装成图片文件对象
        :param name: 本地文件路径
        :max_length: 文件最大长度，默认为None,表明长度不限制
        :return: 返回值极为存储在mysql中打文件id值
        """
        #　TODO：调用fdfs实现文件上传
        # 调用上传图片客户端 Fdfs_client
        conn = Fdfs_client(settings.FDFS_CLIENT_CONF)   # 客户端读取图片配置方案文件client_conf
        ret = conn.upload_by_buffer(content.read())    # 通过文件内容上传文件，读取的是文件的bytes数据
        if not(ret and ret['Status'] == 'Upload successed.'):   # 返回一个字典，携带上传文件成功的信息 <class 'dict'>: {'Group name': 'group1', 'Remote file_id': 'group1/M00/00/02/wKjfiWDCvXyANB3DAABssimwbGY6817331', 'Status': 'Upload successed.', 'Local file name': '', 'Uploaded size': '27.00KB', 'Storage IP': '192.168.223.137'}
            raise serializers.ValidationError('图片上传失败！')
        file_id = ret['Remote file_id']     # 图片上传成功之后的路径/id值

        return file_id

    def url(self, name):
        """
        返回文件下载全路径的方法
        :param name:
        :return:
        """
        return settings.FDFS_URL + name
